package com.boot2.core.dao.mongo;

import com.boot2.core.dao.PageInfo;
import com.mongodb.BasicDBList;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.mysql.cj.xdevapi.InsertResult;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;

import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author zhangweilin
 * @description:mongo 通用 DAO,有可能不兼容于spring boot 2.3.0
 * @date 2018/7/17
 * <p>
 * 参考1:http://lynbazinga.iteye.com/blog/2154409
 * 参考2:https://www.cnblogs.com/lemonbar/p/3894330.html
 * 参考3:https://blog.csdn.net/zsr_251/article/details/47131945
 * 待参考:http://liuluo129.iteye.com/blog/1994045
 * https://www.cnblogs.com/meisha/articles/3630036.html
 * https://blog.csdn.net/u013945725/article/details/78330496
 */

@Deprecated
public interface IMongoDao<T> {


    /**
     * 创建集合
     */
//    public DBCollection createCollection();
    public BasicDBList createCollection();

    /**
     * 查找所有
     *
     * @return
     */
    public List<T> findAll();

    /**
     * 查找单个
     *
     * @param params
     * @return
     */
    public T findOne(Map<String, Object> params);

    /**
     * 查找单个
     *
     * @param id
     * @return
     */
    public T findById(Object id);


    /**
     * 添加单个
     *
     * @param t
     */
    public void insert(T t);

    /**
     * 批量添加
     *
     * @param collection
     * @param entityClass
     */
    public void insert(Collection<? extends T> collection, Class<?> entityClass);

    /**
     * 批量添加
     *
     * @param collection
     */
    public void insertAll(Collection<? extends T> collection);

    /**
     * 统计数量
     *
     * @param params
     * @return
     */
    public long count(Map<String, Object> params);

    /**
     * 查找列表
     *
     * @param params
     * @return
     */
    public List<T> findList(Map<String, Object> params);

    /**
     * 查找列表
     *
     * @param query
     * @return
     */
    public List<T> findList(Query query);

    /**
     * 分页查找列表
     *
     * @param pageInfo
     * @param params
     * @return
     */
    public List<T> findList(PageInfo<T> pageInfo, Map<String, Object> params);

    /**
     * 更新  第一条
     *
     * @param id
     * @param params
     */
    public UpdateResult updateOne(String id, Map<String, Object> params);

    /**
     * 更新  更新所有
     *
     * @param queryParam
     * @param updateParams
     */
    public UpdateResult updateMulti(Map<String, Object> queryParam, Map<String, Object> updateParams);

    /**
     * 先查询，如果没有符合条件的，会执行插入，插入的值是查询值 ＋ 更新值。
     *
     * @param queryParam  查询的条件
     * @param updateParam 更新条件
     */
    public InsertResult upsert(Map<String, Object> queryParam, Map<String, Object> updateParam);


    /**
     * 先查询，如果没有符合条件的，会执行插入，插入的值是查询值 ＋ 更新值。
     *
     * @param queryParam  查询的条件
     * @param updateParam 更新条件
     */
    public T findAndModify(Map<String, Object> queryParam, Map<String, Object> updateParam);


    /**
     * 按id删除
     *
     * @param id
     */
    public DeleteResult deleteById(String id);

    /**
     * 保存文件
     *
     * @param file
     * @param fileUrl
     */
    public void saveFile(File file, String fileUrl);

    /**
     * 读取文件
     *
     * @param filename
     * @return
     */
//    public GridFSDBFile getFileOne(String filename);
    public GridFSFile getFileOne(String filename);


    /**
     * 获取 MongoTemplate
     *
     * @return
     */
    public MongoTemplate getMongoTemplate();
}
